package com.csproj.dispatch.util;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 点面范围判断
 */
public class PointSurface {
    private static double EARTH_RADIUS = 6378.137;

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    /**
     * 通过经纬度获取距离(单位：米)
     *
     * @param lat1
     * @param lng1
     * @param lat2
     * @param lng2
     * @return
     */
    private static double getDistance(double lat1, double lng1, double lat2,
                                      double lng2) {
//        double radLat1 = rad(lat1);
//        double radLat2 = rad(lat2);
//        double a = radLat1 - radLat2;
//        double b = rad(lng1) - rad(lng2);
//        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
//                Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
//        s = s * EARTH_RADIUS;
//        s = Math.round(s * 10000d) / 10000d;


        double latS = (Math.PI/180)*lat1;
        double lngS = (Math.PI/180)*lng1;

        double latE = (Math.PI/180)*lat2;
        double lngE = (Math.PI/180)*lng2;

        //地球半径
        double R = 6371;

        //两点间距离 km，如果想要米的话，结果*1000就可以了
        double d =  Math.acos(Math.sin(latS)*Math.sin(latE)+Math.cos(latS)*Math.cos(latE)*Math.cos(lngE-lngS))*R;

        return d*1000;

    }

    /**
     * 判断一个点是否在圆形区域内
     */
    public static boolean isInCircle(double lng1, double lat1, double lng2, double lat2, String radius) {
        double distance = getDistance(lat1, lng1, lat2, lng2);
        System.out.println("距离：" + distance);
        double r = Double.parseDouble(radius);
        if (distance > r) {
            return false;
        } else {
            System.out.println("有交集");
            return true;
        }
    }

//    public static void main(String[] args) {
//
//        //getDistance(13.249648,-8.829453,13.242323,-8.814638);
//        double M_PI = Math.PI;
//        boolean warn = true;
//        String sss = "{\"geometry\":{\"spatialReference\":{\"wkid\":4326},\"paths\":[[[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249605,-8.829322],[13.249562,-8.829367],[13.249568,-8.829417],[13.24959,-8.829413],[13.249608,-8.829347],[13.249592,-8.829393],[13.249588,-8.829445],[13.249668,-8.829383],[13.24964,-8.82941],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249612,-8.829465],[13.249633,-8.829422],[13.249595,-8.829342],[13.249635,-8.82935],[13.249617,-8.829358],[13.24964,-8.829352],[13.249633,-8.829343],[13.249633,-8.829343],[13.249633,-8.829343],[13.249633,-8.829343],[13.249633,-8.829343],[13.249633,-8.829343],[13.249633,-8.829343],[13.249633,-8.829343],[13.249633,-8.829343],[13.249633,-8.829343],[13.249633,-8.829343],[13.249633,-8.829343],[13.249613,-8.829402],[13.24962,-8.829442],[13.249633,-8.8294],[13.249603,-8.829473],[13.2487,-8.828915],[13.247763,-8.827958],[13.248465,-8.82693],[13.248577,-8.826658],[13.248707,-8.82505],[13.24983,-8.823037],[13.250352,-8.822325],[13.24983,-8.821675],[13.249222,-8.821295],[13.247767,-8.820505],[13.24703,-8.818573],[13.247178,-8.81795],[13.247592,-8.816148],[13.245325,-8.816043],[13.243147,-8.815677],[13.242138,-8.81503],[13.241845,-8.813682],[13.242067,-8.813418],[13.241825,-8.813307],[13.241825,-8.813307],[13.241825,-8.813307],[13.241825,-8.813307]]]},\"symbol\":{\"type\":\"esriSLS\",\"color\":[0,128,0,255],\"width\":4,\"style\":\"esriSLSSolid\"},\"attributes\":{\"Name\":\"Detail info\",\"totalTime\":\"01时59分36秒\"},\"popupTemplate\":{\"showAttachments\":false,\"popupElements\":[{\"type\":\"fields\"}],\"fieldInfos\":[{\"fieldName\":\"totalTime\"}],\"title\":\"{Name}\"}}";
////                "上报的经纬度：message表\n" +
////                "13.249648,-8.829453\n" +
////                "13.249645,-8.829448\n" +
////                "13.24965,-8.829458";
//        if (StringUtils.isNotBlank(sss)) {
//            Map<String, Object> mp = (Map<String, Object>) JSONObject.parse(sss);
//            if (mp != null) {
//                Map<String, Object> geometry = (Map<String, Object>) mp.get("geometry");
//                if (geometry != null) {
//                    Map<String, Integer> spatialReference = (Map<String, Integer>) geometry.get("spatialReference");
//
//                    List<List> paths = (List<List>) geometry.get("paths");
//                    if (paths != null && paths.size() > 0) {
//                        List<List> pos = paths.get(0);
//                        if (pos != null && pos.size() > 0)
//                            for (List sc : pos) {
//                                if (sc.size() == 2) {
//                                    if (spatialReference != null) {
//                                        System.out.println(spatialReference.toString());
//                                        if (spatialReference.get("wkid").toString().equals("4326")) {
//                                            Double lng = ((BigDecimal) sc.get(0)).doubleValue();
//                                            Double lat = ((BigDecimal) sc.get(1)).doubleValue();
//
//
//                                            System.out.println(lng);
//                                            System.out.println(lat);
//
//                                            boolean result = PointSurface.isInCircle(13.249652, -8.829593, lng, lat, "10");
//                                            if (result) {
//                                                System.out.println("有交集");
//                                                warn = false;
//                                                break;
//                                            }
//
//                                        } else if (spatialReference.get("wkid") == 102100) {
//                                            Double mklng = ((BigDecimal) sc.get(0)).doubleValue();
//                                            Double mklat = ((BigDecimal) sc.get(1)).doubleValue();
//
//
//                                            double x = mklng / 20037508.34 * 180;
//                                            double y = mklat / 20037508.34 * 180;
//                                            y = 180 / M_PI * (2 * Math.atan(Math.exp(y * M_PI / 180)) - M_PI / 2);
//                                            Double lng = x;
//                                            Double lat = y;
//
//
//                                            boolean result = PointSurface.isInCircle(13.249648, -8.829453, lng, lat, "1000");
//                                            if (result) {
//                                                System.out.println("有交集");
//                                                warn = false;
//
//                                                System.out.println(warn);
//                                                break;
//                                            }
//                                        }
//                                    }
//                                }
//                            }
//                        if (warn) {
//                            System.out.println("没有交集");
//                        }
//                    }
//
//                }
//
//
//            }
//
//
//      }
//    }
}